#ifndef _THREADPOLL_H
#define _THREADPOLL_H

#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

// 任务结构体
typedef struct task
{
    void (*func)(void *arg);        // 函数指针
    void *arg;
}Task;


// 线程池结构
typedef struct t
{
    // 任务队列
    Task *taskQ;
    int queueCapacity;          // 任务队列的容量
    int queueSize;              // 任务队列的大小
    int queueFront;             // 对头指针
    int queueRear;              // 队尾指针

    // 线程信息
    pthread_t managerID;          // 管理者线程
    pthread_t *workerID;          // 工作的线程编号
    int MinNum;                   // 线程池所能存放线程的最小值
    int MaxNum;                   // 线程池所能存放线程的最大值
    
    int BusyNum;                  // 正在工作的线程个数
    int SurvivalNum;              // 存货的线程的个数
    int exitNum;                  // 需要杀死的线程

    // 添加锁
    pthread_mutex_t mutex_Pool;   // 整个线程池的锁
    pthread_mutex_t mutex_Busy;   // 对busyNum单独设置的锁，因为它需要经常变化

    // 线程池的状态标志
    int Shutdown;                // 用来标记是否需要销毁线程池，销毁为1 否则为0

    // 条件变量
    pthread_cond_t notFull;      // 任务队列是不是满了
    pthread_cond_t notEmpty;     // 任务队列是不是空了

}Threadpool;

// 创建线程池并初始化
Threadpool* create_threadpool(int min, int max, int queuesize);

// 向线程池中添加任务
void ThreadpoolAdd(Threadpool *pool, void (*fun)(void *), void *arg);


// 获取当前线程池中工作线程的个数
int Get_ThreadPool_BusyNum(Threadpool *pool);

// 获取当前线程池中存活线程的个数
int Get_ThreadPool_LiveNum(Threadpool *pool);

// 销毁线程池
int ThreadPoolDestroy(Threadpool *pool);

// 管理者的线程函数
// 监测任务队列中的任务数并及时进行相关操作
void *manager(void *arg);

// 工作者的线程函数
void *work(void *arg);

void ThreadExit(Threadpool *pool);

#endif